[레포트] AWS의 지속적 인테그레이션/딜리버리 총정리! 모던 어플리케이션 구축을 위한 CI/CD 베스트 프렉티스! #AWSSummit
안녕하세요. 클래스메소드의 이병현입니다! 이번 일본의 AWS Summit은 온라인으로 진행되었는데요. 세션을 보고 정리한 내용에 대한 레포트입니다. 제목과 같이 AWS의 CI/CD에 대한 서비스들과 또한 IaC 서비스 소개 또한 포함되어있습니다.
이번 AWS Summit Online Japan은 9월 30일 까지 온디맨드로 시청가능 합니다!
본 세션의 영상은 아래의 링크에서 확인하실 수 있습니다! 본 세션은 일본어로 제공되고 있습니다.
발표자
AWS Japan 시니어 솔루션 아키텍트 福井 厚 (후쿠이 아츠시) fatsushi@
좋아하는 서비스: 서버리스 전반, AWS Code 시리즈, AWS Amplify
본 세션의 목적
- AWS를 이용한 모던 어플리케이션 개발을 대상으로, 지속적인 통합/배포(CI/CD)에 이용 가능한 AWS의 각 서비스에 대해 이해하고 활용할 수 있도록 함
- CI/CD 및 Infrastructure as Code 관련 AWS 서비스에 대한 해설
본 세션에서 다루지 않는 내용
- CI/CD란 무엇인가? 프로젝트에 CI/CD 를 사용하는 메리트나 이유 (Appendix 참조)
Agenda
- CI/CD에 관한 AWS 서비스
- 지속적인 통합
- 지속적인 배포
- Infrastructure as Code
- 정리
모던 어플리케이션 개발 접근법
- 환경 관리를 심플하게
- 코드 변경으로 프로덕트에 영향을 주는 것을 줄임
- 새로운 고품질 서비스 전달(delivery) 속도를 빠르게
- 본 세션의 내용
- 자동화된 오퍼레이션
- 리소스와 어플리케이션에 대한 통찰력을 높임
- 고객과 비지니스 보호
CI/CD 관련 AWS 서비스
AWS IDE toolkits: Eclipse, VS, InteliJ, VSC 등 IDE에서 AWS를 쉽게 이용할 수 있도록 도와줌
AWS X-Ray: AWS 서비스 내에 어플리케이션의 전체적인 흐름을 추적
Amazon CodeGuru: Java 코드를 풀리퀘스트 할 때 개선점, 퍼포먼스의 버틀넥(Bottleneck)이 어디에 있는 지 AI를 통해 알려주는 서비스
AWS SAM: AWS SAM의 풀네임은 AWS Serverless Application Model로 AWS 서버리스 어플리케이션 구축 시 사용할 수 있음
지속적인 통합
목표
- 코드 체크인시 자동적으로 릴리즈
- 일관성 있고 반복 가능한 환경에서 코드의 빌드와 테스트를 실시
- 배포 준비된 아티팩트를 항상 유지
- 빌드 실패시 피드백 루프를 돌릴 수 있음
AWS CodeBuild
풀 매니지드한 빌드 서비스로 소스코드의 컴파일, 테스트 실행, 소프트웨어 패키지를 실행
- 지속적인 스케일, 동시 복수 빌드 프로세스
- 서버 관리가 필요없음
- 이용한 만큼만 지불함 (분 단위 과금)
- Amazon CloudWatch를 통한 모니터링 가능
- 일관되고 이뮤터블(Immutable)한 환경을 위해 개개의 빌드를 신규 도커 컨테이너를 실행
- 모든 오피셜 AWS CodeBuild 이미지에 도커와 AWS CLI가 설치되어 있음
- 필요에 따라 도커 이미지를 작성하여 커스텀 빌드 환경 구성이 가능
AWS CodeBuild: AWS Lambda buildspec
- 의존 모듈 취득하고 전체 테스트 실시
- CloudFormation Package 명령어 실행
AWS CodeBuild: Docker buildspec
- Amazon ECR에 로그인
- 도커 이미지 작성
- 도커 이미지 태그 추가
- 도커 이미지를 ECR에 푸쉬
지속적인 배포
목표
- 변경사항을 테스트용 스테이지 환경에 자동적으로 배포
- 고객에게 영향을 주지 않도록 안전하게 실제 환경에 배포
- 보다 신속하게 고객에게 전달(delievery)
AWS CodePipeline
빠르고 신뢰성 높은 어플리케이션 업데이트를 위해 지속적인 전달(delievery) 서비스를 제공
- 소프트웨어 릴리즈 프로세스를 모델화함으로써 시각화
- 코드가 변경됨에 따라 코드의 빌드, 테스트, 배포를 실시
- 서드파티 툴 및 AWS서비스와의 통합
AWS CodePipeline: 서포트하고 있는 소스
자동적으로 최신 소스코드를 습득하고 릴리즈
브렌치에서 습득
- AWS CodeCommit
- Github
폴더의 객체에서 습득
- Amazon S3
도커 래포지토리에서 습득
- Amazon ECR
AWS CodePipeline: 서포트하고 있는 타겟
여러가지의 배포 형태를 지원
Amazon EC2
- AWS CodeDeploy
- AWS Elastic Beanstalk
- AWS OpsWorks stacks
컨테이너
- AWS CodeDeploy
- Amazon ECS/Fargate
- Amazon ECS/Fargate(blue/green)
서버리스
- AWS CloudFromation(SAM)
- AWS Lambda (AWS CodeDeploy)
- Amazon Service Catalog
- Alexa Skills Kit
AWS CodePipeline: 서포트하고 있는 트리거
자동적인 릴리즈를 실행
Amazon CloudWatch Events
- 스케줄 (야간 릴리즈)
- AWS 서비스의 이벤트
CloudWatch Events 콘솔, API, SDK, CLI, AWS CloudFormation에 이용가능
Webhooks
- GitHub
- Quay
- Artifactory
AWS CodePipeline API、SDK、CLI、AWS CloudFormation에 이용가능
AWS CodeDeploy
서버의 인스턴스나 AWS Lambda에 대한 자동적인 배포
- 어플리케이션의 복잡한 업데이트 실시
- 어플리케이션 디플리이 중 다운타임을 줄임
- 에러 감지 시 자동적으로 롤백을 실행함
- Amazon EC2, AWS Lambda, 온 프레미스 서버, 컨테이너로 배포
본 세션에서 소개하는 배포 타겟의 서버리스 어플리케이션의 실행환경
AWS Lambda
서버리스 펑션
- 이벤트 작동
- 다수의 언어 런타임
- 데이터 소스와의 통합
- 서버관리 불필요
AWS Fargate
서버리스 콘테이너
- 롱 러닝 가능
- OS 추상화
- 풀 매니지먼트 오케스트레이션
- 풀 매니지먼트 클러스트 스케일링
CodeDeploy Lambda 배포
- AWS Lambda의 함수 가중치 별칭을 이용한 트래픽 시프트
- 카나리아 배포 (10분간 10% 트래픽 시프트, 이후 나머지 전부를 시프트)와 선형(linear) 배포 (매 10분 마다 10씩 시프트) 선택 가능
- Validation Hook은 각 스테이지 배포 시 테스트를 활성화
- Hook이 실패하는 경우나 Amazon CloudWatch 알람을 감지한 경우 몇 초 만에 신속하게 롤백
- 콘솔, API, Amazon SNS의 알림, CloudWatch 이벤트를 통한 배포 상태 모니터링 가능
CodeDeploy Lambda 배포 (SAM)
서버리스 어플리케이션 템플릿
- SAM에 의한 Lambda 함수 정의
- 카나리아 배포 정의
- CloudWatch 알람 정의
- Hook용 Lambda 함수 지정
CodeDeploy ECS blue/green 배포
- Green 작업을 프로비저닝하고 로드 밸런서 트래픽을 전환
- 검증 Hook에 따라 각 스테이지의 배포에서 테스트를 활성화
- Hook이 실패하는 경우나 Amazon CloudWatch 알람을 감지한 경우 몇 초 만에 Blue 작업으로 신속하게 롤백
- 콘솔, API, Amazon SNS의 알림, CloudWatch 이벤트를 통한 배포 상태 모니터링 가능
CodeDeploy ECS appspec
- 타겟 타입 지정
- 작업 정의
- 로드 밸런서 정의
- Hook 함수 정의
- ※ 실제로는 Lambdad의 ARN을 지정
중요: 배포를 위한 컨테이너 이미지 태그 부착
- 도커 태그는 배포할 때 뿐만 아니라 각각의 컨테이너를 사용할 때도 이용
- latest나 prod 같은 태그는 스케일 아웃 시 테스트 하지 않은 코드를 실제 환경에 배포하는 결과를 초래할 수 있음
- 배포에는 유니크하고 이뮤터블한 태그를 이용해야 함
- SHA256 혹은 Build ID 등을 이용
Infrastructure as code
목표
- 인프라 스트럭처의 변경을 반복할 수 있고, 예측 가능하게 함
- 인프라 스트럭처를 변경하는 릴리즈 시 코드의 변경과 같은 툴을 이용
- 실제 환경을 스테이징 환경으로 복제하여 지속적인 테스트를 활성화
AWS Serverless Application Model (SAM)
- AWS 상의 서버리스 어플리케이션 구축하기 위한 오픈소스 프레임워크
- 함수, API, 데이터베이스, 이벤트 소스 매핑을 표현하는 간단한 문법을 사용
- 배포 시에 SAM의 문법을 AWS CloudFormation의 문법으로 변환되어 사용되어짐
- 모든 AWS CloudFormation의 리소스 타입을 지원
AWS Serverless Application Model - Amazon Web Services
SAM 템플릿
SAM은 적은 줄로도 많은 리소스를 작성할 수 있음
템플릿 내 작성한 리소스
- AWS Lambda 함수
- Amazon API Gateway
- Amazon DynamoDB 테이블
- AWS IAM 역할
SAM CLI로 SAM 템플릿을 패키지로 배포
AWS CodePipeline
- SAM 어플리케이션은 AWS CloudFormation 디플로이먼트 액션을 이용하여 배포
Jenkins
- SAM CLI 플러그인을 이용
AWS CloudDevelopment Kit (CDK)
- 클라우드 인프라 스트럭처를 JavaScript, TypeScript, Python, Java, C# 으로 정의하기 위한 오픈소스 프레임워크
- 디폴트로 AWS의 베스트 프렉티스를 넣은 하이 레벨 타입 (컨스트럭트 클래스) 제공 (npm 모듈로 패키지)
- AWS CloudFormation으로 리소스 프로비저닝
- 모든 AWS CloudFormation의 리소스 타입을 지원
https://awslabs.github.io/aws-cdk
AWS CDK 템플릿
AWS CloudFormation의 400줄 이상의 템플릿을 TypeScript로 작성한 AWS CDK 템플릿은 22줄로도 가능할 만큼 생산성이 좋음
CDK CLI를 이용한 CDK 템플릿의 synth와 deploy
AWS CodePipeline
- CDK 어플리케이션의 synth 실행결과를 AWS CloudFormation 디플로이먼트 액션을 이용하여 배포
Jenkins
- AWS CDK CLI 플러그인을 이용
AWS CDK 도식화
정리
- 모던 어플리케이션 개발의 접근에는 CI/CD가 필수
- AWS CodeBuild, AWS CodePipeline, AWS CodeDeploy를 잘 활용
- AWS Code 시리즈를 활용하여 힘든 작업들을 AWS에 오프로드하고 비지니스 로직 개발에 집중
Appendix
조직이 CI/CD 원칙을 적용하는 주된 이유
- 새로운 하이퀄리티의 서비스의 딜리버리를 신속하게 하기 위해
- 코드 변경으로 의한 프로덕트의 영향을 줄이기 위해
- 리소스와 어플리케이션에 대한 통찰을 얻기 위해
- 고객과 비지니스를 지키기 위해
CI/CD를 통해 하이퀄리티한 기능을 신속하게 릴리즈
CI/CD를 실천하는 팀은 보다 신뢰성이 향상되고 보다 빠르게 코드를 릴리즈 함
- 변경 실패율 저하 5x
- 커밋부터 배포까지 속도 440x
- 보다 잦은 배포 46x
- 새로운 기능이나 코드에 소비하는 시간 44%
2017 State of DevOps Report (Puppet)
자동화의 가치
- 매뉴얼 프로세스의 절감에 따른 소프트웨어 실행기반 개선
- 보다 짧은 개발 사이클로 더 많은 기능과 더 적은 대기 시간
- 팀의 유동화와 채용의 용이성
릴리즈 프로세스 스테이지
소스
- 소스코드 체크인
- 코드의 피어리뷰
빌드
- 코드의 컴파일
- 유닛 테스트
- 스타일 체커
- 컨테이너 이미지, 함수 배포 패키지 작성
테스트
- 주변 시스템과의 통합 테스트
- 부하 테스트
- UI 테스트
- 보안 테스트
프로덕션
- 실제환경으로의 배포
- 에러를 신속하게 감지하기 위한 실제환경의 모니터링
지속적인 인테그레이션 (통합)
소스 - 빌드
지속적인 딜리버리 (전달)
소스 - 빌드 - 테스트 (매뉴얼) - 프로덕션
지속적인 디플로이먼트 (배포)
소스 - 빌드 - 테스트 - 프로덕션
세션을 보고나서..
AWS의 기본적인 CI/CD에 대한 서비스들에 대해 잘 설명해주는 세션같습니다. 저같은 경우는 따로따로 찾아봤었는데 이렇게 모아놓으니까 보기 편하네요.
세션의 전체적인 내용이 AWS 내의 CI/CD 관련 서비스들의 총망라라 AWS를 사용하여 처음 CI/CD 파이프라인을 구축하는 분들에게 도움이 많이될 것 같습니다.
AWS CDK 같은 경우는 정말 편해보여서 사용해보고 팁같은 것들이 생기면 더 공유해보고 싶은 마음이 들었네요. ? 이상입니다. 읽어주셔서 감사합니다!